from mfrc522 import MFRC522

class RFIDHandler:
    def __init__(self, sck, mosi, miso, rst, cs):
        """
        初始化RFID读卡器模块的引脚
        参数分别为: sck引脚, mosi引脚, miso引脚, rst引脚(空), cs(sda)引脚
        """
        self.rfid = MFRC522(sck, mosi, miso, rst, cs)
        self.door_mode = 'CLOSE'  # 添加门模式的引用

    def read_and_validate_block(self, block_num, expected_data):
        """
        读取指定block的数据并校验是否匹配预期数据。
        :param block_num: 要读取的块号
        :param expected_data: 预期的数据列表，用于校验
        :return: 验证通过返回True，失败返回False
        """
        # 检查门的模式，如果是常开模式，返回False
        if self.door_mode == 'OPEN':
            print("NFC功能已禁用，当前为常开模式。")
            return False
        
        stat, tag_type = self.rfid.request(self.rfid.REQIDL)
        if stat == self.rfid.OK:
            stat, raw_uid = self.rfid.anticoll()
            if stat == self.rfid.OK:
                print("检测到卡片: ")
                print("  -  类型: 0x%02x" % tag_type)
                print("  -  id号: 0x%02x%02x%02x%02x" % (raw_uid[0], raw_uid[1], raw_uid[2], raw_uid[3]))
                
                # 选择当前检测到的卡片
                if self.rfid.select_tag(raw_uid) == self.rfid.OK:
                    key = [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]  # 默认密钥
                    
                    if self.rfid.auth(self.rfid.AUTHENT1A, block_num, key, raw_uid) == self.rfid.OK:
                        # 读取block_num块的数据
                        data = self.rfid.read(block_num)
                        if data is not None:
                            print("Block %d --> %s" % (block_num, data))
                            
                            # 校验block块数据是否为期望值
                            if data == expected_data:
                                print("数据验证成功: Block %d 数据为 %s" % (block_num, data))
                                return True
                            else:
                                print("数据验证失败: Block %d 数据不匹配，读取到的数据为 %s" % (block_num, data))
                                return False
                        else:
                            print("读取失败: Block %d..." % block_num)
                    else:
                        print("认证失败: Block %d..." % block_num)
                    
                    # 停止加密操作
                    self.rfid.stop_crypto1()
                else:
                    print("选择卡片失败")
        return False
